作业、进程、线程

您所在的位置:网站首页 操作系统 线程进程 的概念 他们之间有什么区别 作业、进程、线程

作业、进程、线程

2024-07-12 19:03| 来源: 网络整理| 查看: 265

1. 基本概念

线程,进程是什么?要理解两者概念,须要先了解一下操作系统的一些相关概念。

任务调度:

大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下:

操作系统中的任务调度

作业:用户在一次解决或是一个事务处理过程中要求计算机系统所做的工作的集合,它包括用户程序、所需要的数据集控制命令等。作业是由一系列有序的步骤组成的。作业的完成要经过作业提交、作业收容、作业执行和作业完成4个阶段。在执行一个作业可能会运行多个不同的进程。

进程:程序在一个数据集上的一次运行过程。是操作系统资源分配的基本单位。

           在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位.  进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。

线程:是进程中的一个实体,是被操作系统独立调度和执行的基本单位。一个进程包含一个或多个线程。

              线程只能归属于一个进程并且它只能访问该进程所拥有的资源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。主线程将执行运行时宿主, 而运行时宿主会负责载入CLR。

简单总结:

作业是向计算机提交任务的任务实体,

而进程是执行实体,是资源分配的基本单位,

线程是处理机调度的基本单位。

  

2. 进程        我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具有某种功能的程序,程序是运行于操作系统之上的。           2.1 进程的概念主要有两点:

        第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

       第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。

2.2 进程特征  

        动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。

  并发性:任何进程都可以同其他进程一起并发执行

  独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;

  异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进

  结构特征:进程由程序、数据和进程控制块三部分组成。

  多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

2.3 进程和作业的区别

1、作业是用户向计算机提交任务的任务实体。在用户向计算机提交作业后,系统将它放入外存中的作业等待队列中等待执行。而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。任一进程,只要它被创建,总有相应的部分存在于内存中。 2、一个作业可由多个进程组成,且必须至少由一个进程组成,反过来则不成立。 3、作业的概念主要用在批处理系统中,像UNIX这样的分时系统中就没有作业的概念。而进程的概念则用在几乎所有的多道程序系统中

2.4 进程和程序的区别

1、程序是静态概念,本身可以作为一种软件资源保存;而进程是程序的一次执行过程,是动态概念,它有一定的生命期,是动态地产生和消亡的。

2、进程是一个能独立运行的单位,能与其他进程并发执行,进程是作为资源申请和调度单位存在的;而通常的程序段不能作为一个独立运行的单位。

3、程序和进程无一一对应关系。一方面一个程序可由多个进程共用;另一方面,一个进程在活动中又可顺序地执行若干个程序。 

2.3 进程的状态

      进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。

  1)就绪状态(Ready):

  进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。

  2)运行状态(Running):

  进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

  3)阻塞状态(Blocked):

  由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。

             

  

                                     进程状态的转换

进程状态五态模型: 运行状态(Running):当一个进程正在处理机上运行时。 就绪状态(Ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行. 等待状态又称阻塞状态(Blocked):一个进程正在等待某一事件而暂停运行时。如等待某资源,等待输入/输出完成。 创建状态(NEW):一个进程正在被创建,还没被转到就绪状态之前的状态。 结束状态(Exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致。

 

                                                 

                                                        状态变化图

 

2.5 Windows 和linux进程

      进程创建:WINDOWS:WIN32接口,函数CreateProcess。LINUX:FORK函数,父子进程的区别PPID和PID。

       LINUX中的进程的含义和WINDOWS中是不一样的。LINUX中的进程本身是可以执行的。而WINDOWS中,进程只是表示一个资源的拥有体,是不能执行的。要执行的话,一定需要一个线程。这也部分解释了为什么CreateProcess中为啥一定要传入要执行的文件的名字。LINUX子进程直接使用父亲的地址空间,只有子进程加载一个新的可执行文件的时候才创建自己的地址空间。也就是很多时候共享地址空间,有个函数(忘了)就是如果决定开始写入,则将资源拷贝一份;如果此时突然决定不需要写入,此时就能避免系统资源的消耗。

      进程相对于WINDOWS中的线程,所以同WINDOWS中的线程创建相比,二者的开销应该差不多。

      执行:LINUX:exec, WNDOWS:WIN32函数CreateProcess。

      底层:两者大部分都是C和汇编,在我们看来以为LINUX全是C,WINDOWS是C++,其实不然操作硬件的是汇编和C。

      使用了不少宏定义,简化地址运算和程序结构,如定义一个空地址:0x000000表示NULL。

      内核:

             WINDOWS:相对稳定的API,就是向后兼容,我们总是看到兼容的字眼。升级方便,过于臃肿。复杂的继承关系,藏得结结实实的代码。

             LINUX:不固定的接口,为了更加的技术化,所以LINUX一直改进,很多时候偏离了桌面用户。头文件和执行文件也就是一些算法的改进和函数改进。如果你看完2.4的内核后,再看2.6的内核差异不大,但是不少。升级复杂,考虑的东西太多。数不尽的代码,代码是宝贵的,又是该死的。

     进程算法(优先级):

              LINUX:图形界面少点,内核支持抢占的同时又支持CFS公平调度算法。二叉树、红黑树等算法。

              WINDOWS:进程假死现象普遍,采用阻塞算法,很多时候导致不流畅、卡死。现在win7做了相当大的改进。算法不清楚,以前阻塞编程的不少。内存:基本上两者差不多,在X86你懂得。

 

       WINDOS里的进程/线程是继承自OS/2的。在WINDOS里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲, WINDOS的多进程与Linux并无多大的区别,在WINDOS里的线程才相当于Linux的进程,是一个实际正在执行的代码。但是,WINDOS里同一个进程里各个线程之间是共享数据段的。这才是与Linux的进程最大的不同。

下面这段程序显示了WINDOS下一个进程如何启动一个线程。

int g;

DWORD WINAPI ChildProcess( LPVOID lpParameter ){

int i;

for ( i = 1; i



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3